我們在投資股票的時候,總不會把雞蛋放在同一個籃子裡,會投資多張股票,而投資組合如何分配和會有哪些風險和報酬就是今天要討論的內容。
收益率(Daily Return):代表股票在一天交易中的價值變化百分比
累計超額收益率(Cumulative Return):累計超額收益率為每隻股票在形成期內月超額收益率的簡單加總。
夏普指數(Sharpe ratio):(平均年化報酬率-無風險利率)/年化標準差
收益率的標準差(Standard deviation):
假設連續五天的收益率分別是(17%,22%,15,-5%,5%)
平均報酬率(使用算術平均數) = (17+22+15+(-5)+5) / 5 = 10.8
收益率和平均之間的差(Deviation)和平方差(Deviation Squared)
收益率 | Deviation | Deviation Squared |
---|---|---|
17 | 6.2 | 38.44 |
22 | 11.2 | 125.44 |
15 | 4.2 | 17.64 |
-5 | -15.8 | 249.64 |
5 | -5.8 | 33.64 |
收益率的變異數 = (38.44+125.44+17.64+249.64+33.64) / (5-1) = 116.2 | ||
收益率的標準差 = 收益率的變異數開根號 = 10.78 |
剛剛算的收益率的標準差是使用算術平均數,但股票市場比較類似對數收益率(明天會介紹),有以上的基本知識後再來討論投資的風險和評估。
介紹底下的圖表之前先預先載入需要的套件
# basic
import numpy as np
import pandas as pd
# get data
import pandas_datareader as pdr
# visual
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#time
import datetime as datetime
我們讀取以下股票
2330:台積電
2492:華新科
3045:台灣大
2412:中華電
start = datetime.datetime(2015,1,5)
df_2330 = pdr.DataReader('2330.TW', 'yahoo', start=start)
df_2492 = pdr.DataReader('2492.TW', 'yahoo', start=start)
df_3045 = pdr.DataReader('3045.TW', 'yahoo', start=start)
df_2412 = pdr.DataReader('2412.TW', 'yahoo', start=start)
for stock in [df_2330, df_2492, df_3045, df_2412]:
stock['normalized_price']=stock['Adj Close']/stock['Adj Close'].iloc[0]
我們將我們的投資金額用以下的比例分配
2330:台積電 30%
2492:華新科 20%
3045:台灣大 25%
2412:中華電 25%
之後將分配到的比例乘上每一日的收益率
for stock, weight in zip([df_2330, df_2492, df_3045, df_2412],[0.3, 0.2, 0.25, 0.25]):
stock['weighted daily return']=stock['normalized_price']*weight
並將剛剛算出來的normalized_price統合到一張表
df_total=pd.concat([df_2330['weighted daily return'], df_2492['weighted daily return'], df_3045['weighted daily return'], df_2412['weighted daily return']],axis=1)
df_total.columns=['2330', '2492', '3045', '2412']
將四個股票的收益率乘上你要投資的總金額,現在假設是10萬,並且多增加一個Total Pos
欄位將四個股票目前的金額做加總作為總收益
df_total_money = df_total* 100000
df_total_money['Total Pos']=df_total_money.sum(axis=1)
df_total_money.head()
然後將剛剛總收益繪製圖表
fig = plt.figure(figsize=(10, 6))
plt.plot(df_total_money['Total Pos'], '-' , label="總收益")
plt.plot(df_total_money['2330'], '-' , label="台積電")
plt.plot(df_total_money['2492'], '-' , label="華新科")
plt.plot(df_total_money['3045'], '-' , label="台灣大")
plt.plot(df_total_money['2412'], '-' , label="中華電")
plt.title('收益曲線',loc='right')
plt.xlabel('日期')
plt.ylabel('金額')
plt.grid(True, axis='y')
plt.legend()
可以看到總收益受到華新科的變動而增加
df_total_money['daily return']=df_total_money['Total Pos'].pct_change()
print("累積收益率",df_total_money['Total Pos'].iloc[-1]/df_total_money['Total Pos'].iloc[0]-1)
# 輸出結果
累積收益率 2.074405312864754
print("平均收益率:",df_total_money['daily return'].mean())
# 輸出結果
平均收益率: 0.0014348141399964849
print("收益率標準差:",df_total_money['daily return'].std())
# 輸出結果
收益率標準差: 0.021708565259989755
plt.rcParams['axes.unicode_minus']=False
fig = plt.figure(figsize=(10, 6))
sns.distplot(df_total_money['daily return'].dropna(),bins=100, label="總收益率")
plt.legend()
SR=df_total_money['daily return'].mean()/df_total_money['daily return'].std()
# 輸出結果
0.06770475726506646
代表投資者每增加1%的風險可以換來6%的收益
一年總共有252天的交易日
ASR=np.sqrt(252)*SR
# 輸出結果
1.0747797017961567